package kgame5.enginex {
import kgame5.enginex.event.SendCommandEvent;

import flash.events.EventDispatcher;

/**
 * @author kk
 * 游戏单位.游戏中的一个单位，如坦克，炮弹等
 * 
 * 属性：

senceWorld：ISenceWorld，世界在单个actor心中的反映，只能被感知，不能被操作，提供getEntityVOList()取得VO列表
eventSender：IEventSender,broadcastMeaage,和postMessage.向全世界或者特定物广播。这主要是给EventBatch使用
sendCommand是通知到World,然后world调用特定命令执行（比如炮弹炸伤人，触发区域触发等）。单个actor可以决定自己行为，但是不能决定他人的行为，他可以检测并报告，通知其他去执行
VO
    HaradVO
FSMBatch：并行状态机。增删查改。通过event通知外部。可以取得vo和worldData（游戏中所有vo的集合，这样fsm便可以知道世界的环境，从而做出决策）
   dictFSM：多个fsm
ViewComp：类比于pureMVC中的viewComp,负责操作纯视图元素(这里是一个Group3D(类比于AsWing的一个pane))
   md(Node3D)
   于外部通信使用event，能读取VO

方法：
handelMessage()
listNotifycation():Array;//只返回感兴趣的需要注册的事件。
 * 这个写在构造函数中吧.简单实现就是如果为空，则不显示
 * 实体，存在，名字不是很长。比gameObject要好
 * 
 * !!注意，摄像机和Pariticla也将作为一种实体而存在于世界。
 * 非常灵活非常好的结构！
 */
public class Entity extends EventDispatcher{
	
	//为了性能，直接在子类中添加属性vo
	public var _vo:EntityVO;//子类中包含一个函数，如get shotVO():ShotVO{return vo as ShotVO;}
	
	//TODO 这个要通过EntityConstructorParam来做好
	//需要强制构造函数传入_vo.否则实用中很容易忘掉写它
	public function Entity(p_vo:EntityVO){
		this._vo=p_vo;
	}
//	//添加fsm的事件处理，有空定义一个好的FSMEvent
//	private function onFSMEvent(e:FSMEvent):void{
//		/*var dd:XXX=e.getBody();
//		 * switch(e.getName()){
//		 * case xxx:
//		 * this.executeGameCommand();
//		 * break;
//		 * }
//		 */
//	}

//	//这个是个EventLister，被添加到viewComp的事件监听中,处理view发送来的事件
//	private function onViewCompEvent(e:GUViewEvent):void{
//		/*var data:XX=e.getBody() as XX;
//		 * switch(e.getName()){
//		 * case NNN:
//		 * 处理
//		 * break;
//		 * }
//		 */
//	}

//	//得到fsm命令发送Command.处理view请求发送command
//	protected function onSendCommandEvent(e:SendCommandEvent):void{
//		this.sendCommand(e.getCommandName(),e.getData());//被重新生成一个command.关系不大，command不是每帧都调用
//	}

	//============发通知调用GamePlay的command=============
	//具备发送command的能力,能调用到在GamePlay里注册的Command,比如发射炮弹，或者炮弹爆炸等，需要有总控管理者的逻辑
	//类比于通知神，世界发生的事情，有物件被产生，摧毁，都需要神(GamePlay中注册的command)同意
	protected function sendCommand(commandName:String,data:Object=null):void{
		this.dispatchEvent(new SendCommandEvent(commandName,data));
	}	
}
}
